home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / optivc16 / vdstd.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-03-06  |  14.1 KB  |  306 lines

  1. /*  VDstd.h
  2.  
  3.   vector management functions:
  4.   manipulations on whole arrays or vectors of data type "double"
  5.   (real numbers)
  6.  
  7.   Copyright (c) 1996-1999 by Martin Sander
  8.   All Rights Reserved.
  9. */
  10.  
  11. #ifndef __VDSTD_H
  12. #define __VDSTD_H
  13. #if !defined( __VECLIB_H )
  14. #include <VecLib.h>
  15. #endif
  16.  
  17.  
  18. #ifdef __cplusplus
  19. extern "C" {
  20. #endif
  21.  
  22. /*************************  Generation  **************************/
  23.  
  24. dVector   __vf  VD_vector( ui size );
  25. dVector   __vf  VD_vector0( ui size );
  26.  
  27. /***************  Addressing single vector elements ******************/
  28.  
  29. double _VFAR * VD_Pelement( dVector X, ui n );
  30.       /* returns a pointer to the n'th element of X. For the memory model
  31.          HUGE, the pointer is normalized. */
  32. #define VD_element( X, n )  (*VD_Pelement( X, n ))
  33.  
  34. /*******************  Initialization **********************************/
  35.  
  36. void  __vf  VD_equ0( dVector X, ui size );
  37. void  __vf  VD_equ1( dVector X, ui size );
  38. void  __vf  VD_equC( dVector X, ui size, double C );
  39. void  __vf  VD_equV( dVector Y, dVector X, ui size );
  40. void  __vf  VDx_equV( dVector Y, dVector X, ui size, double A, double B );
  41. void  __vf  VD_ramp( dVector X, ui size, double Start, double Rise );
  42. void  __vf  VD_Parzen( dVector X, ui size );
  43. void  __vf  VD_Welch( dVector X, ui size );
  44. void  __vf  VD_Hanning( dVector X, ui size );
  45. void  __vf  VD_comb( dVector X, ui size, unsigned step, double C );
  46. long  __vf  VD_random( dVector X, ui size, long seed,
  47.                        double MinVal, double MaxVal );
  48. long  __vf  VD_noise( dVector X, ui size, long seed, double Amp );
  49.             /* VD_random and VD_noise return a new seed value.
  50.                random quality of VD_random is much better      */
  51.  
  52.  
  53. /***************  Data-type interconversions  *************************/
  54.        /* for rounding functions, see VDmath.h ! */
  55.  
  56. void  __vf   V_SItoD(  dVector Y, siVector X, ui size );
  57. void  __vf   V_ItoD(   dVector Y, iVector  X, ui size );
  58. void  __vf   V_LItoD(  dVector Y, liVector X, ui size );
  59. void  __vf   V_QItoD(  dVector Y, qiVector X, ui size );
  60.  
  61. void  __vf   V_UStoD(  dVector Y, usVector X, ui size );
  62. void  __vf   V_UtoD(   dVector Y, uVector  X, ui size );
  63. void  __vf   V_ULtoD(  dVector Y, ulVector X, ui size );
  64.  
  65. void  __vf   V_FtoD( dVector Y, fVector X, ui size );
  66. void  __vf   V_DtoF( fVector Y, dVector X, ui size );
  67. #ifdef __BORLANDC__   /* 80-bit IEEE numbers supported */
  68.     void  __vf   V_DtoE( eVector Y, dVector X, ui size );
  69.     void  __vf   V_EtoD( dVector Y, eVector X, ui size );
  70. #else  /* no IEEE number support with Visual C++ */
  71.     #define V_DtoE VD_equV
  72.     #define V_EtoD VD_equV
  73. #endif
  74.  
  75.  
  76. /****************  Index-oriented manipulations ***********************/
  77.  
  78.  
  79. void  __vf  VD_reflect( dVector X, ui size );
  80. void  __vf  VD_rev( dVector Y, dVector X, ui size );
  81. #if defined (V_HUGE)
  82.     void  __vf  VD_rotate( dVector Y, dVector X, ui size, long pos );
  83. #else
  84.     void  __vf  VD_rotate( dVector Y, dVector X, ui size, int pos );
  85. #endif
  86. void  __vf  VD_delete( dVector X, ui size, ui pos );
  87. void  __vf  VD_insert( dVector X, ui size, ui pos, double C );
  88. void  __vf  VD_sort( dVector Y, dVector X, ui size, int dir );
  89. void  __vf  VD_sortind( uiVector Ind, dVector X, ui size, int dir );
  90. void  __vf  VD_subvector( dVector Y, ui sizey, dVector X, int step );
  91. void  __vf  VD_indpick( dVector Y, uiVector Ind, ui sizey, dVector X );
  92. void  __vf  VD_indput(  dVector Y, dVector X, uiVector Ind, ui sizex );
  93. void  __vf  VD_indpick( dVector Y, uiVector Ind, ui size, dVector X );
  94. ui    __vf  VD_searchC( dVector X, ui size, double C, int mode );
  95. void  __vf  VD_searchV( uiVector Ind, dVector X, ui sizex,
  96.                                      dVector Tab, ui sizetab, int mode );
  97.  
  98. void  __vf  VD_polyinterpol( dVector Y, dVector X, ui sizex,
  99.                         dVector XTab, dVector YTab, ui sizetab, unsigned deg );
  100. void  __vf  VD_ratinterpol( dVector Y, dVector X, ui sizex,
  101.                         dVector XTab, dVector YTab, ui sizetab, unsigned deg );
  102. void  __vf  VD_splinederiv2( dVector Y2, dVector XTab, dVector YTab,
  103.                             ui size, int specify, double Yp0, double Ypn );
  104. void  __vf  VD_splineinterpol( dVector Y, dVector X, ui sizex,
  105.                     dVector XTab, dVector YTab, dVector Y2Tab, ui sizetab );
  106.  
  107.  
  108. /***************** Functions of a sub-set of elements  ********************/
  109.  
  110. void  __vf  VD_subvector_equC(  dVector Y, ui subsiz, unsigned samp, double C );
  111. void  __vf  VD_subvector_equV(  dVector Y, ui subsiz, unsigned samp, dVector X );
  112.     /*   for arithmetic functions of subsets, see <VDmath.h>  */
  113.  
  114. /**************** One-Dimensional Vector Operations ***********************/
  115.  
  116. double     __vf  VD_max( dVector X, ui size );
  117. double     __vf  VD_min( dVector X, ui size );
  118. double     __vf  VD_absmax( dVector X, ui size );
  119. double     __vf  VD_absmin( dVector X, ui size );
  120. int        __vf  VD_maxexp( dVector X, ui size );
  121. int        __vf  VD_minexp( dVector X, ui size );
  122. double     __vf  VD_maxind( ui _VFAR *Ind, dVector X, ui size );
  123. double     __vf  VD_minind( ui _VFAR *Ind, dVector X, ui size );
  124. double     __vf  VD_absmaxind( ui _VFAR *Ind, dVector X, ui size );
  125. double     __vf  VD_absminind( ui _VFAR *Ind, dVector X, ui size );
  126. ui         __vf  VD_localmaxima( uiVector Ind, dVector X, ui size );
  127. ui         __vf  VD_localminima( uiVector Ind, dVector X, ui size );
  128. void       __vf  VD_runmax( dVector Y, dVector X, ui size );
  129. void       __vf  VD_runmin( dVector Y, dVector X, ui size );
  130. double     __vf  VD_sum( dVector X, ui size );
  131. double     __vf  VD_prod( dVector X, ui size );
  132. void       __vf  VD_runsum( dVector Y, dVector X, ui size );
  133. void       __vf  VD_runprod( dVector Y, dVector X, ui size );
  134. int        __vf  VD_iselementC( dVector Tab, ui size, double C );
  135. ui         __vf  VD_iselementV( dVector Y, dVector X, ui sizex,
  136.                                 dVector Tab, ui sizetab );
  137.  
  138. /**************** Statistical Functions and Building Blocks *************/
  139.  
  140. double  __vf  VD_sumabs( dVector X, ui size );
  141. double  __vf  VD_mean( dVector X, ui size );
  142. double  __vf  VD_meanwW( dVector X, dVector Wt, ui size );
  143. double  __vf  VD_meanabs( dVector X, ui size );
  144. double  __vf  VD_selected_mean( ui _VFAR *nsel, dVector X, ui size,
  145.                  double XMin, double XMax ); /* takes only x with Min<=x<=Max */
  146. double  __vf  VD_median( dVector X, ui size );
  147. double  __vf  VD_sumdevC( dVector X, ui size, double C );
  148. double  __vf  VD_sumdevV( dVector X, dVector Y, ui size );
  149. double  __vf  VD_avdevC( dVector X, ui size, double C );
  150. double  __vf  VD_avdevV( dVector X, dVector Y, ui size );
  151. double  __vf  VD_ssq( dVector X, ui size );  /* sum-of-squares */
  152. double  __vf  VD_rms( dVector X, ui size );  /* root of the mean square */
  153. double  __vf  VD_ssqdevC( dVector X, ui size, double C );
  154. double  __vf  VD_ssqdevV( dVector X, dVector Y, ui size );
  155. double  __vf  VD_meanvar( double _VFAR *Var, dVector X, ui size );
  156. double  __vf  VD_meanvarwW( double _VFAR *Var, dVector X, dVector Wt, ui size );
  157. double  __vf  VD_varianceC( dVector X, ui size, double C );
  158. double  __vf  VD_varianceV( dVector X, dVector Y, ui size );
  159. double  __vf  VD_varianceCwW( dVector X, dVector Wt, ui size, double C );
  160. double  __vf  VD_varianceVwW( dVector X, dVector Y, dVector Wt, ui size );
  161. double  __vf  VD_chi2( dVector X, dVector Y, dVector InvVar, ui size );
  162. double  __vf  VD_chiabs( dVector X, dVector Y, dVector Wt, ui size );
  163. double  __vf  VD_corrcoeff( dVector X, dVector Y, ui size,
  164.                             double Xmean, double Ymean );
  165. ui    __vf  VD_distribution( uiVector Abund, dVector Limits, ui nbins,
  166.                              dVector X, ui sizex, int mode );
  167.  
  168. void  __vf  VD_linregress( dVector Param, dVector X, dVector Y, ui size );
  169. void  __vf  VD_linregresswW( dVector Param, dVector X, dVector Y,
  170.                              dVector InvVar, ui size );
  171.      /* more linear and nonlinear data fitting routines need MatrixLib
  172.         and are declared in <MDstd.h> !                                */
  173.  
  174.  
  175. /*********  Fourier Transforms, Convolutions, Filtering  ****************/
  176.  
  177. #if defined __cplusplus && defined _CMATH_CLASSDEFS
  178. } // following function cannot be extern "C"
  179. #endif
  180. dComplex  __vf   VD_getRspEdit( void );
  181. #if defined __cplusplus && defined _CMATH_CLASSDEFS
  182. extern "C" {
  183. #endif
  184. void      __vf   VD_setRspEdit( dComplex Trunc );
  185. void  __vf   VDl_FFT( dVector Y, dVector X, ui size, int dir );
  186. void  __vf   VDl_filter( dVector Y, dVector X, dVector Flt, ui size );
  187. void  __vf   VDl_autocorr( dVector Y, dVector X, ui size );
  188. void  __vf   VDl_xcorr( dVector Z, dVector X, dVector Y, ui size );
  189. double __vf  VDl_spectrum( dVector Spc, ui specsiz, dVector X, ui xsiz,
  190.                            dVector Win );
  191.                            /* xsiz >= n*specsiz,  Winsiz = 2*specsiz ! */
  192. void  __vf   VDl_convolve( dVector Y, dVector Flt, dVector X,
  193.                            dVector Rsp, ui size );
  194. void  __vf   VDl_deconvolve( dVector Y, dVector Flt, dVector X,
  195.                              dVector Rsp, ui size );
  196.  
  197. void  __vf   VDs_FFT( dVector Y, dVector X, ui size, int dir );
  198. void  __vf   VDs_filter( dVector Y, dVector X, dVector Flt, ui size );
  199. void  __vf   VDs_autocorr( dVector Y, dVector X, ui size );
  200. void  __vf   VDs_xcorr( dVector Z, dVector X, dVector Y, ui size );
  201. double __vf  VDs_spectrum( dVector Spc, ui specsiz, dVector X, ui xsiz,
  202.                            dVector Win );
  203. void  __vf   VDs_convolve( dVector Y, dVector Flt, dVector X,
  204.                            dVector Rsp, ui size );
  205. void  __vf   VDs_deconvolve( dVector Y, dVector Flt, dVector X,
  206.                              dVector Rsp, ui size );
  207.  
  208. #if( defined( __LARGE__ ) || defined( __COMPACT__ ) )
  209.    #define VD_FFT         VDl_FFT
  210.    #define VD_convolve    VDl_convolve
  211.    #define VD_deconvolve  VDl_deconvolve
  212.    #define VD_filter      VDl_filter
  213.    #define VD_autocorr    VDl_autocorr
  214.    #define VD_xcorr       VDl_xcorr
  215.    #define VD_spectrum    VDl_spectrum
  216. #else
  217.    #define VD_FFT         VDs_FFT
  218.    #define VD_convolve    VDs_convolve
  219.    #define VD_deconvolve  VDs_deconvolve
  220.    #define VD_filter      VDs_filter
  221.    #define VD_autocorr    VDs_autocorr
  222.    #define VD_xcorr       VDs_xcorr
  223.    #define VD_spectrum    VDs_spectrum
  224. #endif
  225.  
  226.  
  227. /********************** Analysis ****************************************/
  228.  
  229. void    __vf  VD_derivC( dVector Y, dVector X, ui size, double Deltat );
  230. void    __vf  VD_derivV( dVector Z, dVector X, dVector Y, ui size );
  231. double  __vf  VD_integralC( dVector X, ui size, double Deltat );
  232. void    __vf  VD_runintegralC( dVector Y, dVector X, ui size, double Deltat );
  233. double  __vf  VD_integralV( dVector X, dVector Y, ui size );
  234. void    __vf  VD_runintegralV( dVector Z, dVector X, dVector Y, ui size );
  235. void    __vf  VD_smooth( dVector Y, dVector X, ui size, unsigned deg );
  236. int     __vf  VD_ismonoton( dVector X, ui size );
  237.  
  238. /****************** Geometrical Vector Arithmetics **************************/
  239.  
  240. double    __vf  VD_scalprod( dVector X, dVector Y, ui size );
  241. void      __vf  VD_xprod( dVector Z, dVector X, dVector Y );
  242. double    __vf  VD_Euclid( dVector X, ui size );
  243.  
  244.  
  245. /***************************  Input and Output *****************************/
  246.  
  247. void  __vf    VD_fprint( FILE _VFAR *stream, dVector X, ui size, unsigned nperline, unsigned linewidth );
  248. #if !defined _Windows || defined __FLAT__ || defined _WIN32
  249.     void  __vf    VD_cprint( dVector X, ui size, unsigned nperline );
  250. #endif
  251. #define       VD_print( x, sz, npl )  VD_fprint( stdout, x, sz, npl, 80 )
  252.   /*  VD_print, VD_cprint usable only for DOS and Win32 console applications! */
  253. void  __vf    VD_write( FILE _VFAR *stream, dVector X, ui size  ); /* in ascii */
  254. void  __vf    VD_read( dVector X, ui size, FILE _VFAR *stream );
  255. void  __vf    VD_nwrite( FILE _VFAR *stream, unsigned n, ui size, ... );
  256. void  __vf    VD_nread( unsigned n, ui size, FILE _VFAR *stream, ... );
  257. void  __vf    VD_setWriteFormat( char _VFAR *FormatString );
  258.                                             /* for VD_write and VD_nwrite */
  259. void  __vf    VD_setWriteSeparate( char _VFAR *SepString ); /* for VD_write */
  260. void  __vf    VD_setNWriteSeparate( char _VFAR *SepString ); /* for VD_nwrite */
  261. #ifdef V_HUGE
  262.     void  __vf    VD_store( FILE _VFAR *stream, dVector X, ui size );
  263.     void  __vf    VD_recall( dVector X, ui size, FILE _VFAR *stream  );
  264. #else
  265.     #ifdef __cplusplus
  266.          void  inline VD_store( FILE _VFAR *stream, dVector X, ui size )
  267.          {    fwrite( X, sizeof(double), size, stream ); 
  268.          }
  269.          void  inline VD_recall( dVector X, ui size, FILE _VFAR *stream )
  270.          {    fread(  X, sizeof(double), size, stream );
  271.          }
  272.     #else
  273.         #define VD_store( str, X, sz )  \
  274.                      fwrite( X, sizeof(double), sz, str )
  275.         #define VD_recall( X, sz, str ) \
  276.                      fread(  X, sizeof(double), sz, str )
  277.     #endif
  278. #endif      /* VD_store, VD_recall in binary format */
  279.  
  280. #ifdef __cplusplus
  281. }    //  end of extern "C"
  282.          // alternative syntax of convolution and deconvolution:
  283.     inline void VDl_convolve( dVector Y, dVector Flt, dVector X, dVector Rsp,
  284.                               ui size, double TruncRe, double TruncIm )
  285.     {   VD_setRspEdit( dcplx( TruncRe, TruncIm ) );
  286.         VDl_convolve( Y, Flt, X, Rsp, size );
  287.     }
  288.     inline void VDl_deconvolve( dVector Y, dVector Flt, dVector X, dVector Rsp,
  289.                                 ui size, double TruncRe, double TruncIm )
  290.     {   VD_setRspEdit( dcplx( TruncRe, TruncIm ) );
  291.         VDl_deconvolve( Y, Flt, X, Rsp, size );
  292.     }
  293.     inline void VDs_convolve( dVector Y, dVector Flt, dVector X, dVector Rsp,
  294.                               ui size, double TruncRe, double TruncIm )
  295.     {   VD_setRspEdit( dcplx( TruncRe, TruncIm ) );
  296.         VDs_convolve( Y, Flt, X, Rsp, size );
  297.     }
  298.     inline void VDs_deconvolve( dVector Y, dVector Flt, dVector X, dVector Rsp,
  299.                                 ui size, double TruncRe, double TruncIm )
  300.     {   VD_setRspEdit( dcplx( TruncRe, TruncIm ) );
  301.         VDs_deconvolve( Y, Flt, X, Rsp, size );
  302.     }
  303. #endif   /*  __cplusplus   */
  304.  
  305. #endif   /*  __VDSTD_H  */
  306.